package demo01;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

/*
 *  客户端实现步骤：
 *      1. 创建一个客户端对象Socket，构造方法绑定服务器端的IP地址和端口号
 *      2. 使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象
 *      3. 使用网络字节输出流OutputStream对象中的方法write()，给服务器发送数据
 *      4. 使用Socket对象中的方法getInputStream()获取网络字节输入流InputStream对象
 *      5. 使用网络字节输入流InputStream对象中的方法read()，读取服务器回写的数据
 *      6. 释放资源（Socket）
 *  注意：
 *      1. 客户端和服务器端进行交互时，必须使用Socket中提供的网络流，不能使用自己创建的流对象
 *      2. 当创建客户端对象Socket的时候，就回去请求服务器端，和服务器端经过3次握手建立连接通路
 *          如果服务器仍未启动，就会抛出异常
 *          如果服务器已经启动，就可以正常进行交互
 */
public class TCPClient {
    public static void main(String[] args) {
        // 1. 创建一个客户端对象Socket，构造方法绑定服务器端的IP地址和端口号
        try (Socket socket = new Socket("localhost", 8888)) {
            // 2. 使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象
            OutputStream outputStream = socket.getOutputStream();
            // 3. 使用网络字节输出流OutputStream对象中的方法write()，给服务器发送数据
            outputStream.write("客户端-->服务器端（接收数据...）".getBytes());
            // 4. 使用Socket对象中的方法getInputStream()获取网络字节输入流InputStream对象
            InputStream inputStream = socket.getInputStream();
            // 5. 使用网络字节输入流InputStream对象中的方法read()，读取服务器回写的数据
            byte[] bytes = new byte[1024];
            int len = inputStream.read(bytes);
            System.out.println(new String(bytes, 0, len)); // 输出从服务器端回读的字节语句
        } catch (Exception e) {
            e.printStackTrace();
        } // 6. 释放资源（Socket），try-resources语句自动完成
    }
}
